from django.core.files.storage import Storage
from django.conf import settings
from django.utils import timezone
from fdfs_client.client import Fdfs_client
from rest_framework import serializers

class FdfsStorage(Storage):

    def _open(self, name, mode='rb'):
        """
        功能：打开本地文件（潜台词：文件存储在服务端本地）
        :param name: 服务端本地文件名
        :param mode: 模式
        :return: 本地打开的文件对象
        """
        # 思考：在我们业务中，图片是保存到fdfs，并是不保存本地
        # 意味着，不需要打开本地文件
        return None


    def _save(self, name, content, max_length=None):
        """
        实现文件保存逻辑
        :param name: 打开的本地文件名
        :param content: 关键参数：存储的文件的"文件对象"
        :param max_length: 最大长度，无需操作
        :return: 返回的结果就是存储在mysql中的数据，言下之意需要返回文件唯一标识
        """
        # 实现fdfs文件上传操作

        # 1、构建fdfs连接对象
        conn = Fdfs_client('./meiduo_mall/client.conf')
        # 2、通过连接对象的函数实现上传
        res = conn.upload_by_buffer(content.read())
        if res['Status'] != 'Upload successed.':
            # 判断文件上传失败
            raise serializers.ValidationError("文件上传失败！")

        # 返回的文件id（fdfs唯一表示，作用用就是存储mysql）
        file_id = res['Remote file_id']
        return file_id


    def exists(self, name):
        """
        判断之前的上传的文件是否存在
        :param name: 本地保存的文件名
        :return: True or False
        """
        # 注意，这个地方一律返回False
        # 含义：无需判断本地文件是否存在，因为我们不是保存本地，而是上传fdfs
        # 文件是否存在由fdfs文件存储系统自定判断
        return False




    def url(self, name):
        # 图片类型字段，在序列化的结果，就是由该函数返回结果控制的！
        # http://192.168.203.153:8888/group1/M00/00/02/CtM3BVrPB4GAWkTlAAGuN6wB9fU4220429
        return settings.FDFS_URL + name
